# re模块 正则表达式
import re

# \w 匹配字母下划线
print(re.findall('\w', 'aAdfsdf_32-='))
# \W 匹配非字母下划线
print(re.findall('\W', 'aAdfsdf_32-='))
# \s 匹配空白字符
print(re.findall('\s', 'aAd\rf\ts\nd\f_32-='))
# \s 匹配非空字符
print(re.findall('\S', 'aAd\rf\ts\nd\f_32-='))
# \d 匹配数字
print(re.findall('\d', 'aAd\rf\ts\nd\f_32-='))
# \D 匹配非数字
print(re.findall('\D', 'aAd\rf\ts\nd\f_32-='))
# \A 匹配字符串的开始
print(re.findall('\Aaa', """aaAaasdaasdfaa"""))
# \D 匹配字符串的结尾 只能匹配未换行的字符串
print(re.findall('aa\Z', 'aaAaasdaasdfaa'))
# ^ 匹配字符串的开始 常用
print(re.findall('^aa', """aaAaasdaasdfaa"""))
# $ 匹配字符串的结尾 常用
print(re.findall('aa$', 'aaAaasdaasdfaa'))
# . 匹配除\n以外的字符
print(re.findall('a.b', 'aAb a b a\nb a*b abbbb a2b'))
# . 通过re.DOTALL 让.匹配所有字符
print(re.findall('a.b', 'aAb a b a\nb a*b abbbb a2b', re.DOTALL))
# * 匹配左侧字符重复0次或无穷次
print(re.findall('ab*', 'ad c abbb bbb ab'))
# + 匹配左侧字符重复1次或无穷次
print(re.findall('ab+', 'ad c abbb bbb ab'))
# ? 匹配左侧字符重复0次或1次
print(re.findall('ab?', 'ad c abbb bbb ab'))
# {n,m} 匹配左侧字符重复n次或m次
# {n} 匹配左侧字符重复n次
# {0,} => *
# {1,} => +
# {0,1} => ?
print(re.findall('ab{1,2}', 'ad c abbb bbb ab'))
# [] 匹配指定字符一次 []中^代表取反
print(re.findall('a[1-5]b', 'ad c abbb bbb a1b'))
print(re.findall('a[1]b', 'ad c abbb bbb a1b'))
print(re.findall('a[0-9a-zA-Z]b', 'ad c abbb bbb a1b'))
print(re.findall('a[^0-9a-zA-Z]b', 'ad c abbb bbb a1b'))

# 例
# 匹配整数和小数
print(re.findall('\d+\.?\d*', 'ad123c1.4abbb1.bbb043ab7'))
